﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using Disk_Pizza_Admin.dao;

namespace Disk_Pizza_Admin
{
    public partial class frmprodutos : Form
    {
        public frmprodutos()
        {
            InitializeComponent();
        }
        OleDbConnection conexao;
        OleDbDataAdapter adapter;
        DataSet ds;
        OleDbCommand comando;
        int codigoProduto = 0; 

        private void frmprodutos_Load(object sender, EventArgs e)
        {
            //carregaComboMaterial();
            limparCampos();
            carregaGrid();
        }

        private void carregaComboMaterial()
        {
            //banco banco = new banco();
            //string con = banco.pegarConexao();
            //conexao = new OleDbConnection(con);
            
            //string sql = "";
            //sql = sql + "    select material from tblMaterial order by material ";

            //comando = new OleDbCommand();
            //comando.Connection = conexao;
            //comando.CommandText = sql;
            //try
            //{
            //    conexao.Open();
            //    comando.CommandType = CommandType.Text;
            //    OleDbDataReader reader = comando.ExecuteReader();
            //    if (reader.HasRows)
            //    {
            //        while (reader.Read())
            //        {
            //            string mat = reader["material"].ToString();
            //            cbxMaterial.Items.Add(mat);
            //        }
            //    }
            //    else
            //    {
            //        cbxMaterial.Items.Add("Sem Material Cadastrado");
            //    }

            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show("Erro ao fazer a operação! " + ex.Message.ToString());
            //}
            //finally
            //{
            //    conexao.Close();
            //}


        }

        //private void btnAdd_Click(object sender, EventArgs e)
        //{
        //    if (cbxMaterial.SelectedItem == null)
        //    {
        //        MessageBox.Show("Selecione um material de estoque na lista");
        //    }
        //    else
        //    {

        //        if (txtQuantidade.Text.Length > 0)
        //        {
        //            if ((cbxMaterial.SelectedItem.ToString().Length > 0) && !(cbxMaterial.SelectedItem.ToString().Trim().Equals("")))
        //            {
        //                if (verificaItemDuplicado())
        //                {
        //                    MessageBox.Show("produto já inserido");
        //                }
        //                else
        //                {
        //                    int qtd = Convert.ToInt32(txtQuantidade.Text);
        //                    lstMateriais.Items.Add(cbxMaterial.SelectedItem + " - (" + qtd + ")");
        //                    txtQuantidade.Text = "";
        //                }
        //            }
        //            else
        //            {
        //                MessageBox.Show("Selecione um material de estoque na lista");
        //            }
        //        }
        //        else
        //        {
        //            MessageBox.Show("Selecione a quantidade utilizada do materal selecionado");
        //        }
        //    }
            
        //}

        //private bool verificaItemDuplicado()
        //{
        //    //bool retorno = false;
        //    ////para cada item na lista, pegue apenas o nome do item e verifique se ja esta cadastrado
        //    //foreach (string item in lstMateriais.Items)
        //    //{
        //    //    string[] array = item.Split('-');
        //    //    string itemArray = array[0].Trim().ToString();

        //    //    if (cbxMaterial.SelectedItem.ToString().Trim().Equals(itemArray))
        //    //    {
        //    //        retorno = true;
        //    //    }
        //    //}
        //    //return retorno;
        //}

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (camposPreenchidos())
            {
                salvaProduto(codigoProduto);
            }
        }

        private void salvaProduto(int codigo)
        {
            string sql = "";

            string produto = txtProduto.Text;
            double preco = Convert.ToDouble(txtPreco.Text.Replace("R$","").Trim());
            string situacao = cbxSituacao.Text;
            string obs = txtObs.Text;
            string data = DateTime.Now.ToString();
            if (codigo == 0)
            {
                sql = "INSERT INTO tblProduto (produto,preco,situacao,observacao,atualizacao) ";
                sql = sql+ " VALUES('" + produto + "','" + preco + "','" + situacao + "','" + obs + "','" + data + "')";
            }
            else
            {
                sql = "UPDATE  tblProduto SET produto = '" + produto + "' ,preco= '" + preco + "', situacao= '" + situacao + "', observacao= '" + obs + "' , atualizacao= '" + data + "'  WHERE CÓDIGO = " + codigo + "";
            }
            executaQuery(sql);
            /*
             AQUI FICAVA A FUNCIONALIDADE DO ESTOQUE - FUNCIONALIDADE FOI RETIRADA
             */
            //if (codigo > 0)
            //{
            //    //exclui todos os itens da tabela tblProdutoMaterial deste produto e registra tudo novamente
            //    sql = " DELETE * FROM tblProdutoMaterial  WHERE (((codigoProduto)=" + codigo + "))";
            //    executaQuery(sql);
            //}

            //Insere na tblProdutoMaterial os itens de estoque
            //if (lstMateriais.Items.Count > 0)
            //{
            //    novoCodigo = pegaCodigoProduto(produto);
            //    //Para cada item da lstMaterial, pega o codigo do nome do item e qtde e salva no banco
            //    foreach (string item in lstMateriais.Items)
            //    {
            //        string[] array = item.Split('-');
            //        string produtoArray = array[0].Trim().ToString();
            //        int codigoMaterial = pegaCodigoMaterial(produtoArray);
            //        int qtd = Convert.ToInt32(array[1].ToString().Replace("(","").Replace(")","").Trim());

            //        sql = "INSERT INTO tblProdutoMaterial (codigoProduto, codigoMaterial, QtdeUtilizada)";
            //        sql = sql + "  VALUES ('" + novoCodigo + "','" + codigoMaterial + "','" + qtd + "')";
            //        executaQuery(sql);
            //    }
            //}

            limparCampos();
            MessageBox.Show("Dados salvos com sucesso!", "Dados Salvos", MessageBoxButtons.OK, MessageBoxIcon.Information);
            txtFiltroProduto.Text = produto;
            carregaGrid();

        }

        private int pegaCodigoProduto(string produto)
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = "";
            sql = sql + "    select código from tblProduto where Produto = '" + produto + "'";

            comando = new OleDbCommand();
            comando.Connection = conexao;
            comando.CommandText = sql;
            try
            {
                conexao.Open();
                comando.CommandType = CommandType.Text;
                OleDbDataReader reader = comando.ExecuteReader();
                if (reader.HasRows)
                {
                    reader.Read();
                    {
                        string cod = reader["código"].ToString();
                        return Convert.ToInt32(cod);
                    }
                }
                else
                {
                    return 0;
                }

            }
            catch (Exception ex)
            {
                return 0;
            }
            finally
            {
                conexao.Close();
            }
        }

        private int pegaCodigoMaterial(string produtoArray)
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = "";
            sql = sql + "    select código from tblMaterial where Material = '"+produtoArray+"'";

            comando = new OleDbCommand();
            comando.Connection = conexao;
            comando.CommandText = sql;
            try
            {
                conexao.Open();
                comando.CommandType = CommandType.Text;
                OleDbDataReader reader = comando.ExecuteReader();
                if (reader.HasRows)
                {
                    reader.Read();
                    {
                        string cod = reader["código"].ToString();
                        return Convert.ToInt32(cod);
                    }
                }
                else
                {
                    return 0;
                }

            }
            catch (Exception ex)
            {
                return 0;
            }
            finally
            {
                conexao.Close();
            }
        }

        private void carregaGrid()
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = "";
            sql = sql + "    SELECT       código, produto, preco, situacao, observacao, atualizacao ";
            sql = sql + "    FROM            tblProduto";
            sql = sql + "    WHERE 1=1 ";
            if (!(txtFiltroProduto.Text.Trim().Equals("")))
            {
                sql = sql + "  AND (produto LIKE '" + txtFiltroProduto.Text + "%')";
            }

            sql = sql + "    ORDER BY Produto";

            adapter = new OleDbDataAdapter(sql, conexao);
            ds = new DataSet();
            adapter.Fill(ds, "tblCliente");


            gridMaterial.DataSource = ds.Tables["tblCliente"];

        }
        private DataTable carregaRel()
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = "";
            sql = sql + "    SELECT       código, produto, preco, situacao, observacao, atualizacao ";
            sql = sql + "    FROM            tblProduto";
            sql = sql + "    WHERE 1=1 ";
            if (!(txtFiltroProduto.Text.Trim().Equals("")))
            {
                sql = sql + "  AND (produto LIKE '" + txtFiltroProduto.Text + "%')";
            }

            sql = sql + "    ORDER BY Produto";

            adapter = new OleDbDataAdapter(sql, conexao);
            ds = new DataSet();
            adapter.Fill(ds, "tblCliente");


            gridMaterial.DataSource = ds.Tables["tblCliente"];

            
            OleDbCommand cmd = new OleDbCommand(sql, conexao);

            conexao.Open();
            
            cmd.CommandType = CommandType.Text;
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);

            ////cria um objeto datatable
            DataTable clientes = new DataTable();

            ////preenche o datatable via dataadapter
            da.Fill(clientes);

            ////atribui o datatable ao datagridview para exibir o resultado
            return clientes;

        }


        private void limparCampos()
        {
            txtPreco.Text = "";
            txtProduto.Text = "";
            txtObs.Text = "";
            cbxSituacao.Text = "";
            codigoProduto = 0; 
        }

        private void executaQuery(string consulta)
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = consulta;

            comando = new OleDbCommand();
            comando.Connection = conexao;
            comando.CommandText = sql;
            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                //ds.AcceptChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao fazer a operação! " + ex.Message.ToString());
            }
            finally
            {
                conexao.Close();                
            }
        }

        private bool camposPreenchidos()
        {
            if (txtProduto.Text.Trim().Equals(""))
            {
                errorProvider1.SetError(txtProduto, "O nome do Produto é de preenchimento obrigatório");
                return false;
            }
            else if (txtPreco.Text.Replace("R$", "").Replace(",","").Trim().Equals(""))
            {
                errorProvider1.SetError(txtPreco, "O preço do Produto é de preenchimento obrigatório");
                return false;
            }
            else if (!(cbxSituacao.Text.Trim().Equals("ATIVO")) && !(cbxSituacao.Text.Trim().Equals("INATIVO")))
            {
                errorProvider1.SetError(cbxSituacao, "Marque a Situação do produto como Ativo ou Inativo");
                return false;
            }
            else
            {
                return true;
            }
        }

        private void btnProduto_Click(object sender, EventArgs e)
        {
            txtFiltroProduto.Text = ""; 
            carregaGrid();
            codigoProduto = 0;
            limparCampos();

        }

        private void btnBuscarProduto_Click(object sender, EventArgs e)
        {
            carregaGrid();
        }

        private void gridMaterial_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                string codProdut = Convert.ToString(gridMaterial.Rows[e.RowIndex].Cells["CÓDIGO"].Value);

                if (!(codProdut.Trim().Equals("")))
                {
                    preencheCamposProduto(codProdut);
                }
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }

        private void preencheCamposProduto(string codProdut)
        {
            banco banco = new banco();
            string con = banco.pegarConexao();
            conexao = new OleDbConnection(con);
            
            string sql = "";
            sql = sql + "    SELECT        * ";
            sql = sql + "    FROM            tblProduto";
            sql = sql + "    WHERE CÓDIGO = " + Convert.ToInt32(codProdut) + "";

            adapter = new OleDbDataAdapter(sql, conexao);
            ds = new DataSet();
            adapter.Fill(ds, "tblCliente");
            this.txtProduto.Text = Convert.ToString(ds.Tables["tblCliente"].Rows[0]["Produto"]);
            double preco = Convert.ToDouble(ds.Tables["tblCliente"].Rows[0]["preco"]);
            txtPreco.Text = preco.ToString("F").PadLeft(txtPreco.Mask.Length, '0'); ;

            this.cbxSituacao.Text = Convert.ToString(ds.Tables["tblCliente"].Rows[0]["situacao"]);
            this.txtObs.Text = Convert.ToString(ds.Tables["tblCliente"].Rows[0]["Observacao"]);  
            
            //preenche os campos de materiais / Estoque
            preencheCamposEstoque(codProdut);

            codigoProduto = Convert.ToInt32(codProdut);
        }

        private void preencheCamposEstoque(string codProdut)
        {
            
            //lstMateriais.Items.Clear();

            //banco banco = new banco();
            //string con = banco.pegarConexao();
            //conexao = new OleDbConnection(con);
            
            //string sql = "";
            //sql = sql + "    SELECT tblMaterial.Material, tblProdutoMaterial.QtdeUtilizada ";
            //sql = sql + "    FROM tblProdutoMaterial INNER JOIN tblMaterial";
            //sql = sql + "    on tblMaterial.código = tblProdutoMaterial.codigoMaterial";
            //sql = sql + "    where tblProdutoMaterial.codigoProduto =  " + Convert.ToInt32(codProdut) + "";

            //comando = new OleDbCommand();
            //comando.Connection = conexao;
            //comando.CommandText = sql;
            //try
            //{
            //    conexao.Open();
            //    comando.CommandType = CommandType.Text;
            //    OleDbDataReader reader = comando.ExecuteReader();
            //    if (reader.HasRows)
            //    {
            //        while(reader.Read())
            //        {
            //            string itemEstoque = reader["Material"].ToString();
            //            string itemQtd = reader["QtdeUtilizada"].ToString();
            //            string result = itemEstoque + " - (" + itemQtd + ")";
            //            lstMateriais.Items.Add(result);
            //        }
            //    }

            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show("Falha ao realizar a operação "+ ex.Message.ToString());
            //}
            //finally
            //{
            //    conexao.Close();
            //} 

        }

        private void btnRetirarLista_Click(object sender, EventArgs e)
        {
            //try
            //{
            //    lstMateriais.Items.Remove(lstMateriais.SelectedItem);
            //}
            //catch
            //{
            //    MessageBox.Show("selecione um material da lista para removelo");
            //}
        }

        private void txtFiltroProduto_TextChanged(object sender, EventArgs e)
        {
            carregaGrid();
        }


    }
}
